/*
 * Copyright (c) 2018 Tencent. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
const AbstractModel = require("../../common/abstract_model");

/**
 * DeleteProject request structure.
 * @class
 */
class DeleteProjectRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;

    }
}

/**
 * License list viewed by authorization
 * @class
 */
class License extends  AbstractModel {
    constructor(){
        super();

        /**
         * The number of licenses of this type.
         * @type {number || null}
         */
        this.Count = null;

        /**
         * License status. 0: unbound; 1: bound; 2: service suspension; 3: refund.
         * @type {number || null}
         */
        this.Status = null;

        /**
         * Expiration timestamp: s.
         * @type {string || null}
         */
        this.ExpireTime = null;

        /**
         * Service duration: s.
         * @type {string || null}
         */
        this.Duration = null;

        /**
         * Remaining days: days.
         * @type {number || null}
         */
        this.RemainDay = null;

        /**
         * The list of license ids of this type.
         * @type {Array.<string> || null}
         */
        this.LicenseIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Count = 'Count' in params ? params.Count : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.ExpireTime = 'ExpireTime' in params ? params.ExpireTime : null;
        this.Duration = 'Duration' in params ? params.Duration : null;
        this.RemainDay = 'RemainDay' in params ? params.RemainDay : null;
        this.LicenseIds = 'LicenseIds' in params ? params.LicenseIds : null;

    }
}

/**
 * ModifyDevice response structure.
 * @class
 */
class ModifyDeviceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetLicenses request structure.
 * @class
 */
class GetLicensesRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Page number.
         * @type {number || null}
         */
        this.PageNum = null;

        /**
         * Number of pages.
         * @type {number || null}
         */
        this.PageSize = null;

        /**
         * projectId
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * DeviceId
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * License status. 0: unbound; 1: bound; 2: service suspension; 3: refund.
         * @type {number || null}
         */
        this.Status = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.PageNum = 'PageNum' in params ? params.PageNum : null;
        this.PageSize = 'PageSize' in params ? params.PageSize : null;
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.Status = 'Status' in params ? params.Status : null;

    }
}

/**
 * BatchDeleteDevices request structure.
 * @class
 */
class BatchDeleteDevicesRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id of the targeted deleted device.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Device id array of the targeted deleted device.
         * @type {Array.<string> || null}
         */
        this.DeviceIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceIds = 'DeviceIds' in params ? params.DeviceIds : null;

    }
}

/**
 * Session information.
 * @class
 */
class SessionInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Session id.
         * @type {string || null}
         */
        this.SessionId = null;

        /**
         * Remote device id.
         * @type {string || null}
         */
        this.RemoteDeviceId = null;

        /**
         * On-Site device id.
         * @type {string || null}
         */
        this.FieldDeviceId = null;

        /**
         * Target resolution.
         * @type {string || null}
         */
        this.Resolution = null;

        /**
         * Session start time.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * Session end time.
         * @type {number || null}
         */
        this.EndTime = null;

        /**
         * Call quality: good|normal|bad.
         * @type {string || null}
         */
        this.Quality = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SessionId = 'SessionId' in params ? params.SessionId : null;
        this.RemoteDeviceId = 'RemoteDeviceId' in params ? params.RemoteDeviceId : null;
        this.FieldDeviceId = 'FieldDeviceId' in params ? params.FieldDeviceId : null;
        this.Resolution = 'Resolution' in params ? params.Resolution : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;
        this.Quality = 'Quality' in params ? params.Quality : null;

    }
}

/**
 * DescribeDeviceInfo request structure.
 * @class
 */
class DescribeDeviceInfoRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id to which the target device belongs.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Target device id.
         * @type {string || null}
         */
        this.DeviceId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;

    }
}

/**
 * DescribeSessionStatisticsByInterval response structure.
 * @class
 */
class DescribeSessionStatisticsByIntervalResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Session statistics for each time period.
         * @type {Array.<SessionIntervalStatistic> || null}
         */
        this.SessionStatistics = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.SessionStatistics) {
            this.SessionStatistics = new Array();
            for (let z in params.SessionStatistics) {
                let obj = new SessionIntervalStatistic();
                obj.deserialize(params.SessionStatistics[z]);
                this.SessionStatistics.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeRecentSessionList request structure.
 * @class
 */
class DescribeRecentSessionListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Page number, beginning from 1.
         * @type {number || null}
         */
        this.PageNumber = null;

        /**
         * Number of entries per page.
         * @type {number || null}
         */
        this.PageSize = null;

        /**
         * Device id, supports filtering by remote device or on-site device.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * Start time of the time range. the maximum time range is the last two hours. if not specified or out of range, the start time is calculated as two hours ago.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * End time of the time range. the maximum time range is the last two hours. if not specified or out of range, the end time is calculated as the current time.
         * @type {number || null}
         */
        this.EndTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.PageNumber = 'PageNumber' in params ? params.PageNumber : null;
        this.PageSize = 'PageSize' in params ? params.PageSize : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;

    }
}

/**
 * Latest session information
 * @class
 */
class RecentSessionInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Session id.
         * @type {string || null}
         */
        this.SessionId = null;

        /**
         * Remote device id.
         * @type {string || null}
         */
        this.RemoteDeviceId = null;

        /**
         * On-Site device id.
         * @type {string || null}
         */
        this.FieldDeviceId = null;

        /**
         * Target resolution.
         * @type {string || null}
         */
        this.Resolution = null;

        /**
         * Session start time.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * Last updated time.
         * @type {number || null}
         */
        this.LatestUpdateTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SessionId = 'SessionId' in params ? params.SessionId : null;
        this.RemoteDeviceId = 'RemoteDeviceId' in params ? params.RemoteDeviceId : null;
        this.FieldDeviceId = 'FieldDeviceId' in params ? params.FieldDeviceId : null;
        this.Resolution = 'Resolution' in params ? params.Resolution : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.LatestUpdateTime = 'LatestUpdateTime' in params ? params.LatestUpdateTime : null;

    }
}

/**
 * DescribeProjectInfo request structure.
 * @class
 */
class DescribeProjectInfoRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Target project id. required parameter.
         * @type {string || null}
         */
        this.ProjectId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;

    }
}

/**
 * ModifyPolicy request structure.
 * @class
 */
class ModifyPolicyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id for modifying permission configuration.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Remote device id for modifying permission configuration.
         * @type {string || null}
         */
        this.RemoteDeviceId = null;

        /**
         * Array of on-site device ids involved in permission modification.
         * @type {Array.<string> || null}
         */
        this.FieldDeviceIds = null;

        /**
         * The target permission mode to modify, black for blocklist, white for allowlist.
         * @type {string || null}
         */
        this.PolicyMode = null;

        /**
         * Modification mode, add for adding (associating on-site devices), remove for deletion (dissociating on-site devices), set for setting (updating on-site device association).
         * @type {string || null}
         */
        this.ModifyMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.RemoteDeviceId = 'RemoteDeviceId' in params ? params.RemoteDeviceId : null;
        this.FieldDeviceIds = 'FieldDeviceIds' in params ? params.FieldDeviceIds : null;
        this.PolicyMode = 'PolicyMode' in params ? params.PolicyMode : null;
        this.ModifyMode = 'ModifyMode' in params ? params.ModifyMode : null;

    }
}

/**
 * DescribeDeviceInfo response structure.
 * @class
 */
class DescribeDeviceInfoResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Device name.
         * @type {string || null}
         */
        this.DeviceName = null;

        /**
         * Device type: "field" specifies on-site devices (controlled party), and "remote" specifies remote devices (controlling party).
         * @type {string || null}
         */
        this.DeviceType = null;

        /**
         * Device status: offline means offline, ready means online and ready, connected means in session.
         * @type {string || null}
         */
        this.DeviceStatus = null;

        /**
         * Last updated time of device status.
         * @type {string || null}
         */
        this.LastReportTime = null;

        /**
         * Modification time of device information.
         * @type {string || null}
         */
        this.ModifyTime = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DeviceName = 'DeviceName' in params ? params.DeviceName : null;
        this.DeviceType = 'DeviceType' in params ? params.DeviceType : null;
        this.DeviceStatus = 'DeviceStatus' in params ? params.DeviceStatus : null;
        this.LastReportTime = 'LastReportTime' in params ? params.LastReportTime : null;
        this.ModifyTime = 'ModifyTime' in params ? params.ModifyTime : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetLicenseStat request structure.
 * @class
 */
class GetLicenseStatRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * DescribeProjectList response structure.
 * @class
 */
class DescribeProjectListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Array of project information.
         * @type {Array.<ProjectInfo> || null}
         */
        this.Projects = null;

        /**
         * Total number of projects.
         * @type {number || null}
         */
        this.Total = null;

        /**
         * Number of projects returned in this request.
         * @type {number || null}
         */
        this.Num = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Projects) {
            this.Projects = new Array();
            for (let z in params.Projects) {
                let obj = new ProjectInfo();
                obj.deserialize(params.Projects[z]);
                this.Projects.push(obj);
            }
        }
        this.Total = 'Total' in params ? params.Total : null;
        this.Num = 'Num' in params ? params.Num : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyProject response structure.
 * @class
 */
class ModifyProjectResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * BatchDeletePolicy response structure.
 * @class
 */
class BatchDeletePolicyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Remote device id list with failed permission configuration deletion.
         * @type {Array.<string> || null}
         */
        this.FailedRemoteDeviceIds = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.FailedRemoteDeviceIds = 'FailedRemoteDeviceIds' in params ? params.FailedRemoteDeviceIds : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetLicenseStat response structure.
 * @class
 */
class GetLicenseStatResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Valid authorization.
         * @type {number || null}
         */
        this.Valid = null;

        /**
         * Bound authorization.
         * @type {number || null}
         */
        this.Bound = null;

        /**
         * Unbound authorization.
         * @type {number || null}
         */
        this.UnBound = null;

        /**
         * Expired authorization.
         * @type {number || null}
         */
        this.Expire = null;

        /**
         * Number of authorization timeouts for the current month.
         * @type {number || null}
         */
        this.MonthlyExpire = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Valid = 'Valid' in params ? params.Valid : null;
        this.Bound = 'Bound' in params ? params.Bound : null;
        this.UnBound = 'UnBound' in params ? params.UnBound : null;
        this.Expire = 'Expire' in params ? params.Expire : null;
        this.MonthlyExpire = 'MonthlyExpire' in params ? params.MonthlyExpire : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyPolicy response structure.
 * @class
 */
class ModifyPolicyResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of on-site device ids with association failed.
         * @type {Array.<string> || null}
         */
        this.FailedInsertIds = null;

        /**
         * List of on-site device ids with disassociation failed.
         * @type {Array.<string> || null}
         */
        this.FailedDeleteIds = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.FailedInsertIds = 'FailedInsertIds' in params ? params.FailedInsertIds : null;
        this.FailedDeleteIds = 'FailedDeleteIds' in params ? params.FailedDeleteIds : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Query the authorization binding status of user devices
 * @class
 */
class Device extends  AbstractModel {
    constructor(){
        super();

        /**
         * Device id.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * Device name.
         * @type {string || null}
         */
        this.DeviceName = null;

        /**
         * Number of bound licenses.
         * @type {number || null}
         */
        this.LicenseCount = null;

        /**
         * Remaining days: days.
         * @type {number || null}
         */
        this.RemainDay = null;

        /**
         * Expiration time: s.
         * @type {string || null}
         */
        this.ExpireTime = null;

        /**
         * Service duration: s.
         * @type {string || null}
         */
        this.Duration = null;

        /**
         * List of bound license ids.
         * @type {Array.<string> || null}
         */
        this.LicenseIds = null;

        /**
         * Monthly license duration limit.
         * @type {number || null}
         */
        this.MonthlyRemainTime = null;

        /**
         * Monthly maximum duration (minutes).
         * @type {number || null}
         */
        this.LimitedTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.DeviceName = 'DeviceName' in params ? params.DeviceName : null;
        this.LicenseCount = 'LicenseCount' in params ? params.LicenseCount : null;
        this.RemainDay = 'RemainDay' in params ? params.RemainDay : null;
        this.ExpireTime = 'ExpireTime' in params ? params.ExpireTime : null;
        this.Duration = 'Duration' in params ? params.Duration : null;
        this.LicenseIds = 'LicenseIds' in params ? params.LicenseIds : null;
        this.MonthlyRemainTime = 'MonthlyRemainTime' in params ? params.MonthlyRemainTime : null;
        this.LimitedTime = 'LimitedTime' in params ? params.LimitedTime : null;

    }
}

/**
 * DescribeSessionStatistics request structure.
 * @class
 */
class DescribeSessionStatisticsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Device id.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * Start time, unit: seconds.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * End time in seconds.
         * @type {number || null}
         */
        this.EndTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;

    }
}

/**
 * BatchDeleteDevices response structure.
 * @class
 */
class BatchDeleteDevicesResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of device ids with deletion failed.
         * @type {Array.<string> || null}
         */
        this.FailedDeviceIds = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.FailedDeviceIds = 'FailedDeviceIds' in params ? params.FailedDeviceIds : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyProject request structure.
 * @class
 */
class ModifyProjectRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id of the target project to modify.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Modified project name, leave blank if not modifying.
         * @type {string || null}
         */
        this.ProjectName = null;

        /**
         * Modified project description, leave blank if not modifying.
         * @type {string || null}
         */
        this.ProjectDescription = null;

        /**
         * The modified permission mode, black for blocklist, white for allowlist. if not specified, no modification will be made.
         * @type {string || null}
         */
        this.PolicyMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.ProjectName = 'ProjectName' in params ? params.ProjectName : null;
        this.ProjectDescription = 'ProjectDescription' in params ? params.ProjectDescription : null;
        this.PolicyMode = 'PolicyMode' in params ? params.PolicyMode : null;

    }
}

/**
 * DescribeRecentSessionList response structure.
 * @class
 */
class DescribeRecentSessionListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number.
         * @type {number || null}
         */
        this.Total = null;

        /**
         * Conversation list.
         * @type {Array.<RecentSessionInfo> || null}
         */
        this.RecentSessionList = null;

        /**
         * Number of items on this page.
         * @type {number || null}
         */
        this.Num = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Total = 'Total' in params ? params.Total : null;

        if (params.RecentSessionList) {
            this.RecentSessionList = new Array();
            for (let z in params.RecentSessionList) {
                let obj = new RecentSessionInfo();
                obj.deserialize(params.RecentSessionList[z]);
                this.RecentSessionList.push(obj);
            }
        }
        this.Num = 'Num' in params ? params.Num : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyDevice request structure.
 * @class
 */
class ModifyDeviceRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * The target project id to modify the device's affiliated project.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * The target device id to modify the device.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * The modified device name; if not filled in, no modification will be made.
         * @type {string || null}
         */
        this.DeviceName = null;

        /**
         * The modified device authentication password; if not filled in, no modification will be made.
         * @type {string || null}
         */
        this.DeviceToken = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.DeviceName = 'DeviceName' in params ? params.DeviceName : null;
        this.DeviceToken = 'DeviceToken' in params ? params.DeviceToken : null;

    }
}

/**
 * DescribeProjectList request structure.
 * @class
 */
class DescribeProjectListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * The maximum number of projects returned per page. the default value is 10 if it is not filled in.
         * @type {number || null}
         */
        this.PageSize = null;

        /**
         * The current page number. the default value is 1 (homepage) if it is not filled in.
         * @type {number || null}
         */
        this.PageNumber = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.PageSize = 'PageSize' in params ? params.PageSize : null;
        this.PageNumber = 'PageNumber' in params ? params.PageNumber : null;

    }
}

/**
 * Project information.
 * @class
 */
class ProjectInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Project name.
         * @type {string || null}
         */
        this.ProjectName = null;

        /**
         * Project description.
         * @type {string || null}
         */
        this.ProjectDescription = null;

        /**
         * Project permission mode, black for blocklist, white for allowlist.
         * @type {string || null}
         */
        this.PolicyMode = null;

        /**
         * Project information modification time.
         * @type {string || null}
         */
        this.ModifyTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.ProjectName = 'ProjectName' in params ? params.ProjectName : null;
        this.ProjectDescription = 'ProjectDescription' in params ? params.ProjectDescription : null;
        this.PolicyMode = 'PolicyMode' in params ? params.PolicyMode : null;
        this.ModifyTime = 'ModifyTime' in params ? params.ModifyTime : null;

    }
}

/**
 * BatchDeletePolicy request structure.
 * @class
 */
class BatchDeletePolicyRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id of the deleted permission configuration.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Remote device id list of the deleted permission configuration.
         * @type {Array.<string> || null}
         */
        this.RemoteDeviceIds = null;

        /**
         * Permission mode of the deleted permission configuration, black for blocklist, white for allowlist.
         * @type {string || null}
         */
        this.PolicyMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.RemoteDeviceIds = 'RemoteDeviceIds' in params ? params.RemoteDeviceIds : null;
        this.PolicyMode = 'PolicyMode' in params ? params.PolicyMode : null;

    }
}

/**
 * DescribeDeviceSessionList response structure.
 * @class
 */
class DescribeDeviceSessionListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number.
         * @type {number || null}
         */
        this.Total = null;

        /**
         * Conversation list.
         * @type {Array.<SessionInfo> || null}
         */
        this.DeviceSessionList = null;

        /**
         * Number of items on this page.
         * @type {number || null}
         */
        this.Num = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Total = 'Total' in params ? params.Total : null;

        if (params.DeviceSessionList) {
            this.DeviceSessionList = new Array();
            for (let z in params.DeviceSessionList) {
                let obj = new SessionInfo();
                obj.deserialize(params.DeviceSessionList[z]);
                this.DeviceSessionList.push(obj);
            }
        }
        this.Num = 'Num' in params ? params.Num : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeProjectInfo response structure.
 * @class
 */
class DescribeProjectInfoResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project name.
         * @type {string || null}
         */
        this.ProjectName = null;

        /**
         * Project description.
         * @type {string || null}
         */
        this.ProjectDescription = null;

        /**
         * Project permission mode, black for blocklist, white for allowlist.
         * @type {string || null}
         */
        this.PolicyMode = null;

        /**
         * Project information modification time.
         * @type {string || null}
         */
        this.ModifyTime = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectName = 'ProjectName' in params ? params.ProjectName : null;
        this.ProjectDescription = 'ProjectDescription' in params ? params.ProjectDescription : null;
        this.PolicyMode = 'PolicyMode' in params ? params.PolicyMode : null;
        this.ModifyTime = 'ModifyTime' in params ? params.ModifyTime : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DeleteProject response structure.
 * @class
 */
class DeleteProjectResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetDeviceLicense response structure.
 * @class
 */
class GetDeviceLicenseResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the number of available licenses bound to the specified device.
         * @type {number || null}
         */
        this.AvailableCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AvailableCount = 'AvailableCount' in params ? params.AvailableCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateDevice response structure.
 * @class
 */
class CreateDeviceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeSessionStatisticsByInterval request structure.
 * @class
 */
class DescribeSessionStatisticsByIntervalRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Statistical time interval: hour|day|month.
         * @type {string || null}
         */
        this.StatisticInterval = null;

        /**
         * Device id.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * Start time in seconds.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * End time in seconds.
         * @type {number || null}
         */
        this.EndTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.StatisticInterval = 'StatisticInterval' in params ? params.StatisticInterval : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;

    }
}

/**
 * CreateDevice request structure.
 * @class
 */
class CreateDeviceRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Create the project id to which the device belongs.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Create a device id, which must be unique within the project, consisting of lowercase english letters, numbers, and underscores, with a length not exceeding 18.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * Create a device name, with a length of less than 24, which can include chinese, numbers, english letters, and underscores.
         * @type {string || null}
         */
        this.DeviceName = null;

        /**
         * Device type, field for on-site device (controlled device), remote for remote device (control device), default is field if not specified.
         * @type {string || null}
         */
        this.DeviceType = null;

        /**
         * Device authentication password, consisting of uppercase and lowercase english letters and digits, must be 16 characters.
         * @type {string || null}
         */
        this.DeviceToken = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.DeviceName = 'DeviceName' in params ? params.DeviceName : null;
        this.DeviceType = 'DeviceType' in params ? params.DeviceType : null;
        this.DeviceToken = 'DeviceToken' in params ? params.DeviceToken : null;

    }
}

/**
 * DescribeSessionStatistics response structure.
 * @class
 */
class DescribeSessionStatisticsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of sessions.
         * @type {number || null}
         */
        this.SessionNum = null;

        /**
         * Call duration, unit: minutes.
         * @type {number || null}
         */
        this.TotalDuration = null;

        /**
         * Number of active on-site devices.
         * @type {number || null}
         */
        this.ActiveFieldDeviceNum = null;

        /**
         * Number of active remote devices.
         * @type {number || null}
         */
        this.ActiveRemoteDeviceNum = null;

        /**
         * Proportion of excellent sessions, unit: %.
         * @type {number || null}
         */
        this.NotBadSessionRatio = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SessionNum = 'SessionNum' in params ? params.SessionNum : null;
        this.TotalDuration = 'TotalDuration' in params ? params.TotalDuration : null;
        this.ActiveFieldDeviceNum = 'ActiveFieldDeviceNum' in params ? params.ActiveFieldDeviceNum : null;
        this.ActiveRemoteDeviceNum = 'ActiveRemoteDeviceNum' in params ? params.ActiveRemoteDeviceNum : null;
        this.NotBadSessionRatio = 'NotBadSessionRatio' in params ? params.NotBadSessionRatio : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetDevices response structure.
 * @class
 */
class GetDevicesResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Device authorization list.
         * @type {Array.<Device> || null}
         */
        this.Devices = null;

        /**
         * Number of tables in the list.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Devices) {
            this.Devices = new Array();
            for (let z in params.Devices) {
                let obj = new Device();
                obj.deserialize(params.Devices[z]);
                this.Devices.push(obj);
            }
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * GetLicenses response structure.
 * @class
 */
class GetLicensesResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * License list.
         * @type {Array.<License> || null}
         */
        this.Licenses = null;

        /**
         * Number of license list items.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Licenses) {
            this.Licenses = new Array();
            for (let z in params.Licenses) {
                let obj = new License();
                obj.deserialize(params.Licenses[z]);
                this.Licenses.push(obj);
            }
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeDeviceSessionList request structure.
 * @class
 */
class DescribeDeviceSessionListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Page number, beginning from 1.
         * @type {number || null}
         */
        this.PageNumber = null;

        /**
         * Number of entries per page.
         * @type {number || null}
         */
        this.PageSize = null;

        /**
         * Device id.
         * @type {string || null}
         */
        this.DeviceId = null;

        /**
         * Start time.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * End time.
         * @type {number || null}
         */
        this.EndTime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.PageNumber = 'PageNumber' in params ? params.PageNumber : null;
        this.PageSize = 'PageSize' in params ? params.PageSize : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;

    }
}

/**
 * GetDevices request structure.
 * @class
 */
class GetDevicesRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Page number.
         * @type {number || null}
         */
        this.PageNum = null;

        /**
         * Number of pages.
         * @type {number || null}
         */
        this.PageSize = null;

        /**
         * Project id.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Device id.
         * @type {string || null}
         */
        this.DeviceId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.PageNum = 'PageNum' in params ? params.PageNum : null;
        this.PageSize = 'PageSize' in params ? params.PageSize : null;
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;

    }
}

/**
 * CreateProject response structure.
 * @class
 */
class CreateProjectResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id, length is 16 characters.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Session statistics data in a unit time interval
 * @class
 */
class SessionIntervalStatistic extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of active on-site devices.
         * @type {number || null}
         */
        this.ActiveFieldDeviceNum = null;

        /**
         * Number of active remote devices.
         * @type {number || null}
         */
        this.ActiveRemoteDeviceNum = null;

        /**
         * Number of sessions.
         * @type {number || null}
         */
        this.SessionNum = null;

        /**
         * Session age, unit: minutes.
         * @type {number || null}
         */
        this.TotalDuration = null;

        /**
         * Timestamp in seconds.
         * @type {number || null}
         */
        this.StartTime = null;

        /**
         * Timestamp in seconds.
         * @type {number || null}
         */
        this.EndTime = null;

        /**
         * Proportion of excellent sessions, unit: %.
         * @type {number || null}
         */
        this.NotBadSessionRatio = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ActiveFieldDeviceNum = 'ActiveFieldDeviceNum' in params ? params.ActiveFieldDeviceNum : null;
        this.ActiveRemoteDeviceNum = 'ActiveRemoteDeviceNum' in params ? params.ActiveRemoteDeviceNum : null;
        this.SessionNum = 'SessionNum' in params ? params.SessionNum : null;
        this.TotalDuration = 'TotalDuration' in params ? params.TotalDuration : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;
        this.NotBadSessionRatio = 'NotBadSessionRatio' in params ? params.NotBadSessionRatio : null;

    }
}

/**
 * GetDeviceLicense request structure.
 * @class
 */
class GetDeviceLicenseRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project id to which the target device belongs.
         * @type {string || null}
         */
        this.ProjectId = null;

        /**
         * Target device id.
         * @type {string || null}
         */
        this.DeviceId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectId = 'ProjectId' in params ? params.ProjectId : null;
        this.DeviceId = 'DeviceId' in params ? params.DeviceId : null;

    }
}

/**
 * CreateProject request structure.
 * @class
 */
class CreateProjectRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Project name, up to 24 characters.
         * @type {string || null}
         */
        this.ProjectName = null;

        /**
         * Project description, up to 120 characters, default is empty if not filled.
         * @type {string || null}
         */
        this.ProjectDescription = null;

        /**
         * Permission mode, black for blocklist, white for allowlist. defaults to black if not specified.
         * @type {string || null}
         */
        this.PolicyMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ProjectName = 'ProjectName' in params ? params.ProjectName : null;
        this.ProjectDescription = 'ProjectDescription' in params ? params.ProjectDescription : null;
        this.PolicyMode = 'PolicyMode' in params ? params.PolicyMode : null;

    }
}

module.exports = {
    DeleteProjectRequest: DeleteProjectRequest,
    License: License,
    ModifyDeviceResponse: ModifyDeviceResponse,
    GetLicensesRequest: GetLicensesRequest,
    BatchDeleteDevicesRequest: BatchDeleteDevicesRequest,
    SessionInfo: SessionInfo,
    DescribeDeviceInfoRequest: DescribeDeviceInfoRequest,
    DescribeSessionStatisticsByIntervalResponse: DescribeSessionStatisticsByIntervalResponse,
    DescribeRecentSessionListRequest: DescribeRecentSessionListRequest,
    RecentSessionInfo: RecentSessionInfo,
    DescribeProjectInfoRequest: DescribeProjectInfoRequest,
    ModifyPolicyRequest: ModifyPolicyRequest,
    DescribeDeviceInfoResponse: DescribeDeviceInfoResponse,
    GetLicenseStatRequest: GetLicenseStatRequest,
    DescribeProjectListResponse: DescribeProjectListResponse,
    ModifyProjectResponse: ModifyProjectResponse,
    BatchDeletePolicyResponse: BatchDeletePolicyResponse,
    GetLicenseStatResponse: GetLicenseStatResponse,
    ModifyPolicyResponse: ModifyPolicyResponse,
    Device: Device,
    DescribeSessionStatisticsRequest: DescribeSessionStatisticsRequest,
    BatchDeleteDevicesResponse: BatchDeleteDevicesResponse,
    ModifyProjectRequest: ModifyProjectRequest,
    DescribeRecentSessionListResponse: DescribeRecentSessionListResponse,
    ModifyDeviceRequest: ModifyDeviceRequest,
    DescribeProjectListRequest: DescribeProjectListRequest,
    ProjectInfo: ProjectInfo,
    BatchDeletePolicyRequest: BatchDeletePolicyRequest,
    DescribeDeviceSessionListResponse: DescribeDeviceSessionListResponse,
    DescribeProjectInfoResponse: DescribeProjectInfoResponse,
    DeleteProjectResponse: DeleteProjectResponse,
    GetDeviceLicenseResponse: GetDeviceLicenseResponse,
    CreateDeviceResponse: CreateDeviceResponse,
    DescribeSessionStatisticsByIntervalRequest: DescribeSessionStatisticsByIntervalRequest,
    CreateDeviceRequest: CreateDeviceRequest,
    DescribeSessionStatisticsResponse: DescribeSessionStatisticsResponse,
    GetDevicesResponse: GetDevicesResponse,
    GetLicensesResponse: GetLicensesResponse,
    DescribeDeviceSessionListRequest: DescribeDeviceSessionListRequest,
    GetDevicesRequest: GetDevicesRequest,
    CreateProjectResponse: CreateProjectResponse,
    SessionIntervalStatistic: SessionIntervalStatistic,
    GetDeviceLicenseRequest: GetDeviceLicenseRequest,
    CreateProjectRequest: CreateProjectRequest,

}
